package com.bandaotixi.cashier.api.common.util;

import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;

@Slf4j
public class FileUtil {
    /**
     * 删除指定天数之前的文件和文件夹
     *
     * @param directory 目标目录路径
     * @param daysAgo   多少天前的文件需要删除
     */
    public static void deleteFilesOlderThan(File directory, int daysAgo) {

        if (!directory.exists()) {
            return;
        }

        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();

        // 递归删除符合条件的文件和文件夹
        deleteRecursively(directory, now, daysAgo);
    }

    /**
     * 递归删除文件和文件夹
     *
     * @param fileOrDir 文件或文件夹
     * @param now       当前时间
     * @param daysAgo   多少天前的文件需要删除
     */
    private static void deleteRecursively(File fileOrDir, LocalDateTime now, int daysAgo) {
        if (fileOrDir.isDirectory()) {
            // 如果是文件夹，递归遍历其内容
            File[] files = fileOrDir.listFiles();
            if (files != null) {
                for (File child : files) {
                    deleteRecursively(child, now, daysAgo); // 子文件夹总是可以删除
                }
            }
        }
        // 获取文件或文件夹的最后修改时间
        long lastModifiedMillis = fileOrDir.lastModified(); // 获取时间戳（毫秒）
        // 获取文件或文件夹的最后修改时间
        LocalDateTime lastModifiedTime = LocalDateTime.ofInstant(java.time.Instant.ofEpochMilli(lastModifiedMillis), ZoneId.systemDefault());

        // 计算文件或文件夹是否超过指定天数
        long daysDifference = ChronoUnit.DAYS.between(lastModifiedTime, now);
        if (daysDifference >= daysAgo) {
            // 删除文件或空文件夹
            boolean deleted = fileOrDir.delete();
            if (!deleted) {
                log.warn("无法删除: {}", fileOrDir.getAbsolutePath());
            }
        }
    }
}
